package com.seeyon.ctp.rest.resources;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.ndk.kit.*;
import com.seeyon.cap4.form.bean.*;
import com.seeyon.cap4.form.service.CAP4FormManager;
import com.seeyon.cap4.template.manager.CAPDataListSqlHelpManager;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.authenticate.domain.User;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.login.UserUtil;
import com.seeyon.ctp.organization.bo.V3xOrgEntity;
import com.seeyon.ctp.organization.bo.V3xOrgMember;
import com.seeyon.ctp.organization.manager.OrgManager;
import org.apache.commons.logging.Log;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;
import java.util.Map;

@Path("jssdk")
@Produces({MediaType.APPLICATION_JSON})
public class CustomUnFlowDataResources extends BaseResource {
    private static final Log log = CtpLogFactory.getLog(CustomUnFlowDataResources.class);

    private static final String fkUnFlowTemplateCode = AppContext.getSystemProperty("ndk.fkUnFlowTemplateCode");

    private OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager");
    private CAP4FormManager cap4FormManager = (CAP4FormManager) AppContext.getBean("cap4FormManager");
    private CAPDataListSqlHelpManager capDataListSqlHelpManager = (CAPDataListSqlHelpManager) AppContext.getBean("capDataListSqlHelpManager");

    /**
     * 定义了一个POST请求方法，用于发送无流程数据
     * @param param 一个包含字符串和对象的Map，作为请求的参数
     * @return 返回一个Response对象
     * @throws Exception 如果在处理过程中出现异常
     */
    @POST
    @Path("custom/unflow/datas")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response sendCollaboration(Map<String, Object> param) throws Exception {
        log.info("SAP档案数据推送json入参:" + JSON.toJSONString(param));
        try {
            // 创建一个 JSON 对象，并将参数 param 转换为 JSON 格式
            JSONObject jsonObj = new JSONObject(param);

            // 获取当前用户
            User user = AppContext.getCurrentUser();
            if (user == null) {
                // 如果JSON对象中包含"senderCode"键，则获取其对应的值并去除空格后赋给senderCode变量
                String senderCode = "";
                if (jsonObj.containsKey("senderCode")) {
                    senderCode = StrKit.str(jsonObj.get("senderCode")).trim();
                }
                // 如果当前用户为null，则返回错误信息，提示发起人工号不能为空
                if ("".equals(senderCode)) {
                    return ok(MessageKit.errorMsg("E", "发起人工号不能为空值"));
                }
                // 根据发起人工号获取组织成员列表
                List<V3xOrgEntity> orgMemberList = orgManager.getEntityList(V3xOrgMember.class.getSimpleName(), "code", senderCode, null, false, true);

                // 如果组织成员列表为空，则返回错误信息，提示发起人工号在OA系统中不存在
                if (orgMemberList.isEmpty()) {
                    return ok(MessageKit.errorMsg("E", "发起人工号[" + senderCode + "]在OA系统中不存在"));
                }

                /*将用户信息更新到当前线程*/
                V3xOrgMember v3xOrgMember = (V3xOrgMember) orgMemberList.get(0);
                User user_new = UserUtil.build(v3xOrgMember, "", null);
                if (user_new != null) {
                    user = user_new;
                    UserUtil.setCurrentUser(user_new);
                }
            }
            // 通过表单码获取表单 bean 对象
            FormBean formBean = cap4FormManager.getFormByFormCode(fkUnFlowTemplateCode);
            // 获取表单中的唯一字段列表
            List<List<String>> uniqueFieldList = formBean.getUniqueFieldList();
            // 唯一字段初始化为空
            String uniqueField = "";
            // 如果唯一字段列表不为空
            if (!uniqueFieldList.isEmpty()) {
                // 获取唯一字段列表中的第一个字段
                uniqueField = uniqueFieldList.get(0).get(0);
            }
            if("".equals(uniqueField)){
                return ok(MessageKit.errorMsg("E", "系统中未设置数据唯一规则，请联系管理员！"));
            }
            // 根据唯一字段名称获取字段 Bean 对象
            FormFieldBean uniqueFieldBean = formBean.getFieldBeanByName(uniqueField);

            // 获取表单中的主表名称
            String tableName = formBean.getMasterTableBean().getTableName();
            // 获取主表单字段 bean 列表
            List<FormFieldBean> mainFieldBeans = formBean.getMasterTableBean().getFields();
            if (jsonObj.containsKey("datas")) {
                // 获取数据 JSON 数组
                JSONArray dataJsonArray = jsonObj.getJSONArray("datas");
                if(!dataJsonArray.isEmpty()){
                    // 遍历数据 JSON 数组
                    for(int i = 0; i < dataJsonArray.size(); i++){
                        // 获取单个数据 JSON 对象
                        JSONObject jsonObject = dataJsonArray.getJSONObject(i);
                        // 获取 Json 对象中字段描述.trim()后的值并转为字符串
                        String dataCode = StrKit.str(jsonObject.get(uniqueFieldBean.getDesc().trim()));
                        // 创建 StringBuilder 对象
                        StringBuilder stb = new StringBuilder();
                        // 拼接查询 SQL 语句
                        stb.append("select id from ").append(tableName).append(" where ").append(uniqueField);
                        stb.append(" = '").append(dataCode).append("'");
                        // 执行查询 SQL 语句获取结果列表
                        List<Object> dataList = capDataListSqlHelpManager.selectDataList(stb.toString(), null);
                        // 数据 ID 初始化为空
                        String dataId = "";
                        // 如果查询结果不为空
                        if (!dataList.isEmpty()) {
                            for (int k = 0; k < dataList.size(); k++) {
                                Map<String, Object> dataMap = (Map<String, Object>) dataList.get(k);
                                dataId = StrKit.str(dataMap.get("id"));
                            }
                        }
                        // 创建 FormDataMasterBean 对象
                        FormDataMasterBean formDataMasterBean = null;
                        if(!"".equals(dataId)){
                            formDataMasterBean = cap4FormManager.getDataMasterBeanById(Long.parseLong(dataId), formBean, null);
                        } else {
                            formDataMasterBean = FormDataMasterBean.newInstance(formBean);
                        }
                        // 遍历 JSON 对象的键值
                        for (String key : jsonObject.keySet()) {
                            // 遍历主表单字段 bean 列表
                            for (FormFieldBean formFieldBean : mainFieldBeans) {
                                // 获取字段描述并进行比较
                                String fieldDesc = formFieldBean.getDesc().trim();
                                // 如果键与字段描述相等
                                if (key.equals(fieldDesc)) {
                                    // 将值进行数据转换并字符串化
                                    String value = StrKit.str(DataConversionKit.dataConversion(formFieldBean.getInputType(), StrKit.str(jsonObject.get(key)), formFieldBean.getDesc()));
                                    // 将转换后的值添加到 formDataMasterBean 对象中
                                    formDataMasterBean.addFieldValue(formFieldBean.getName(), value);
                                }
                            }
                        }
                        // 添加无流程数据的表单能力
                        FormCap4Kit.addUnFlowFormDataCap4(formDataMasterBean, formBean);
                    }
                }
            }
            // 返回成功信息
            return ok(MessageKit.errorMsg("S", ""));
        } catch (Exception e) {
            // 如果发生异常，记录错误日志并返回错误信息
            log.error("添加或更新无流程档案数据接口异常", e);
            return ok(MessageKit.errorMsg("E", e.getMessage()));
        }
    }

}
